Przykad 7.4. Realizacja przeszukiwania wszerz
public Solution search(INode initial, INode goal) {
   // Jeli ustawienie pocztkowe (initial) stanowi cel (goal), to wyjd
   if (initial.equals(goal)) { return new Solution (initial, goal); }

   // Zacznij od stanu pocztkowego
   INodeSet open = StateStorageFactory.create(StateStateFactory.QUEUE);
   open.insert(initial.copy());
   
   // Stany, ktre ju odwiedzilimy
   INodeSet closed = StateStorageFactory.create(StateStateFactory.HASH);
   while (!open.isEmpty()) {
      INode n = open.remove();
      closed.insert(n);

      // Tumacz wszystkie nastpne ruchy na dodane stany OPEN (otwarte)
      DoubleLinkedList<IMove> moves = n.validMoves();
      for (Iterator<IMove> it = moves.iterator(); it.hasNext(); ) {
         IMove move = it.next();

         // Wykonaj ruch na kopii
         INode successor = n.copy();
         move.execute(successor);

         // Jeli ju odwiedzony, to wicej nie poszukuj tego stanu
         if (closed.contain(successor) != null) {
            continue;
         }

         // Zapisz poprzedni ruch, eby mie lad rozwizania. Jeli
         // znaleziono rozwizanie, to wyjd, w przeciwnym razie dodaj
         // do zbioru OPEN.
         successor.storedData(new Transition(move, n));
         if (successor.equals(goal)) {
            return new Solution (initial, successor);
         }
         open.insert(successor);
      }
   }

   return new Solution (initial, goal, false);  // Nie ma rozwizania
}
